import java.util.concurrent.CountDownLatch;

/**
 * 接口同步过来的数据，
 * 需要分别进行多个业务操作，然后主线程依赖前面子线程的结果，
 * 可以使用 计数器来获得所有子线程的任务执行状态，再进行下一步操作
 *
 *
 * 结果：执行时间减半，在主线程得到了所有线程执行结束的时刻
 * author：杨亚旭
 *
 */
public class CountDownLatchDemo {



    public static void main(String[] args) throws InterruptedException {
        long currentTimeMillis = System.currentTimeMillis();
        CountDownLatch latch=new CountDownLatch(2);
        //生成订单号
        String order="123456";
        //通知资金组
        noticeCapital(order,latch);
        //记录流水
        recordFlow(order,latch);
        latch.await();
        System.out.println("执行完成，耗时"+(System.currentTimeMillis()-currentTimeMillis)+"毫秒");
    }

    private static void noticeCapital(String order, final CountDownLatch latch) {
        new Thread(() -> {
            System.out.println("资金组收到订单号:"+order+",开始进行处理");
            try {
                //模拟接口耗时
                Thread.sleep(1000L);
                latch.countDown();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("资金组业务处理结束");
        }).start();

    }

    private static void recordFlow(String order, CountDownLatch latch) {
        new Thread(() -> {
            System.out.println("#记录流水#流水号:"+order+",开始进行处理");
            try {
                //模拟接口耗时
                Thread.sleep(1000L);
                latch.countDown();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("#记录流水#,处理结束");
        }).start();
    }
}
